/**
 * 带有左侧选择按钮的的已选择列列表组建  --怕其他节点收到影响，复制一份做优化
 * @author limy
 * @update 2021-01-26
 * @description
 *		弃用，禁止使用，不维护
 * */
;(function($){
	$.widget("tempo.tempo_grid_columns_selected_with_btn_page",{
		options:{
			width:270,
			height:300,
			pendingDiv:{},//待选区
			contextMeta:[],//上下文元信息
			contextHiddenColNames:[],//需要隐藏显示的上下文的字段名称
			udfContextColLabels:{},//用户自定义的上下文字段的显示标签，例如：{name:"评价元素"}，name字段的显示标签修改为"评价元素"
			udfColLabels:[],//自定义列的显示标签列表
			udfColsModel:[],//自定义列的模式
			udfColumnBinds:[],//自定义列的绑定设置。
			parentDialog:{},//父窗口对象
			rowsData:[],//传递数据
			typeSelectValue:null, //可选参数
			fieldErrorMap:null,   //可选参数
			fieldset:{show:false},//可选参数，外边框,默认不显示
			gridMaxData:1,//可选参数，列表中能添加的数据个数，默认最多添加一个，重复选择会覆盖 
			uniquefield:false,
			allowTypes:[],//可选参数，当前列表允许添加的数据类型，为空时允许所有数据类型
			editable:true,
			showBtn:true,
			pagination:false,
			defaultWidth:["20px","75px","75px","77px"],
			leftTreeChangeable:true,
			removeDup:false,//去重=-=，当右边表格已经有的时候，右移去掉重复的
			directToEdit:null,
			multEdit:false,//默认只有一行在编辑
			isRendercboxClass:true
		},
		_checkParams:function(thisOptionsObj){
			if(!thisOptionsObj.parentDialog){
				console.error("mine-grid-columns-selected-with-btn.js-> parentDialog  is null or undefined");
				return false;
			}
			if(!thisOptionsObj.pendingDiv){
				console.error("mine-grid-columns-selected-with-btn.js-> pendingDiv  is null or undefined");
				return false;
			}
			return true;
		},
		_create:function(){
			//检查参数的合法性
			if(!this._checkParams(this.options)){
				return;
			}
			//生成ID的函数
			var gUid=function(){
				return jsPlumbUtil.uuid();
			};
			var udfColsModel= this.options.udfColsModel;
			var pId=gUid();//根DOM对象ID
            var leftId=gUid();//左侧DOM对象ID
			var rightId=gUid();//右侧DOM对象ID
			var chooseBtnId=gUid();
			var editable = this.options.editable;
			var uniquefield = this.options.uniquefield;
			var leftTreeChangeable = this.options.leftTreeChangeable;
			var showBtn = this.options.showBtn;
		    var cRootClass="tempo-mine-grid-columns-with-selbtn";//根对象CSS类
		    var leftClass="tempo-mine-grid-columns-with-selbtn-btn-bar";//选择按钮对象的CSS类
			var rightClass="tempo-mine-grid-columns-with-selbtn-grid";//右侧表格容器的CSS类
			var chooseBtnClass="tempo-columnselect-right-remove";//按钮样式
			var pDiv = $('<div/>',{"class":cRootClass,"id":pId});
			var parentEle;
			if (this.options.fieldset.show){
				parentEle = this._getFieldSet().appendTo(this.element);
			} else {
				parentEle = pDiv.appendTo(this.element);
			}
			//左侧带有选择按钮的Div
			var leftBtnDiv=$('<div/>',{"class":leftClass,"id":leftId}).appendTo(parentEle);
			//增加选择按钮
			leftBtnDiv.append($("<button class='tempo-mine-grid-columns-with-selbtn-btn' id='"+chooseBtnId+"'></button>"))
			this.options.leftBtnDiv = leftBtnDiv;
			this.options.chooseBtnId = chooseBtnId;
			//右侧带有表格的Div
			var rightDiv=$('<div/>',{"class":rightClass,"id":rightId}).appendTo(parentEle);
            
			//提取Options对象中的配置
			var thisObj=this;
			var getOption=function(optionName) {
				return  thisObj.options[optionName];
			};
			//表格组建ID
			this.options.rightId=rightId;
			var multiFlag = editable;
			if (!thisObj.options["gridMaxData"] || thisObj.options["gridMaxData"] == 1){
				multiFlag = false;
			}
			var directToEdit = getOption("directToEdit");
			debugger;
			this.element.find("#"+rightId).tempo_grid_columns_selected_page({
				width : getOption("width")-50,
				height : getOption("height"),
				pendingDiv:getOption("pendingDiv"),
				contextMeta:getOption("contextMeta"), //上下文字段信息列表
				udfColLabels:getOption("udfColLabels"),
				udfColsModel:getOption("udfColsModel"),
				udfContextColLabels:getOption("udfContextColLabels"),//将显示名称更改为"评价元素"
			    contextHiddenColNames:getOption("contextHiddenColNames"),//将字段名和类型隐藏
				rowsData:this._addIdColumn(getOption("rowsData")),
				parentDialog:getOption("parentDialog"),
				udfColumnBinds:getOption("udfColumnBinds"), //用户自定义列需要绑定的对象
				directToEdit:getOption("directToEdit"),
				editable:editable,
				showBtn:showBtn,
				pagination:getOption("pagination"),
				multEdit:getOption("multEdit"),
				isRendercboxClass:getOption("isRendercboxClass"),
				udfOnSelectRow:function(rowId,status){
					// 选中一行，绑定从列表到树的事件
					if (thisObj.options.editable){
						thisObj._bindRightToLeft();
					}
				},
				udfOnSelectAll:function(rowId,status){
					// 选中所有行，绑定从列表到树的事件
					if (thisObj.options.editable){
						thisObj._bindRightToLeft();
					}
				},
				multiselect:multiFlag,
				defaultWidth:getOption("defaultWidth"),
				leftTreeChangeable:leftTreeChangeable
			});
			//右侧按钮的选择事件绑定
			if (thisObj.options.editable){
				this._bindLeftToRight();
			}
			thisObj.options.pendingDiv.find(".tempo-mine-column-field").bind("click",function(){
				if (thisObj.options.editable){
					thisObj._bindLeftToRight();
				}
			});
			this._checkboxStyleSet();
		},
		_setOption:function(key,val){
			
		},
		_bindEvent:function(ul) {
			
		},
		/**
		 * 调用右侧表格的外露方法
		 * */
        _callRightGridFunction:function(functionName) {
        	return this.element.find("#"+this.options.rightId).tempo_grid_columns_selected_page(functionName);
		},
		/**
		 * 获取所有数据 --分页也适用
		 */
		getAllData:function(){
        	return this._callRightGridFunction("getAllData");
		},
		/**
		 * 保存当前修改的行数据 -- 仅供点击确定时使用
		 */
		saveCurrentEditRow:function(){
			return this._callRightGridFunction("saveCurrentEditRow");
		},
		getGridTable:function(){
			return this._callRightGridFunction("getGridTable");
		},
		/**
		 * 得到所有编辑中和未编辑的数据的rowdatas
		 */
		getAllEditOrDataFunction:function(){
			return this._callRightGridFunction("getAllEditOrDataFunction")();
		},
		getFieldErrorMap:function(){
			return this._callRightGridFunction("getFieldErrorMap");
		},
		getStatusFormatterFunction:function(){
			return this._callRightGridFunction("getStatusFormatterFunction");
		},
		getEditRowData:function(){
			return this._callRightGridFunction("getEditRowData");
		},
		/**
		 * 获取当前页数据  -不适用分页获取全部数据
		 * @returns {*} 前页数据
		 */
		getRowData:function(){
			return this._callRightGridFunction("getRowData");
		},
		/**
		 * 批量设置当前页选中的数据中的某一字段的值
		 * @param gridTableTemp jqGrid的表格对象，可以通过jqGrid的getGridTable方法获取
		 * @param columnName 字段的名称--对应创建时的name--只能写一个
		 * @param columnValue 字段的值
		 * @param columnType 字段类型 --可根据字段类型过滤 --可以不写
		 */
		batchSyncData:function (gridTableTemp, columnName, columnValue, columnType){
			return this.element.find("#"+this.options.rightId).tempo_grid_columns_selected_page("batchSyncData", gridTableTemp, columnName, columnValue, columnType);
		},
		_getFieldSet:function() {
			// 获取fieldset组件
        	var fieldset = $("<fieldset style='border: 1px solid #000; border-color: #d3d3d3'><legend>"+this.options.fieldset.label+"</legend></fieldset>");
        	// 27为列表表头高度，24为fieldset的边框
        	fieldset.css({"height":this.options.height+27+24});
        	return fieldset;
		},
		clearTable: function() {
			this._callRightGridFunction("getFromGridToTreeFunction")("",this._getFieldErrorMap());
		},
		_bindLeftToRight:function(){
			debugger
			// 绑定从左侧树到右侧表格的事件
			var thisObj = this;
			var thisEle = thisObj.element.find(".tempo-mine-grid-columns-with-selbtn-btn,.tempo-mine-grid-columns-with-selbtn-left-btn");
			thisEle.attr("class","tempo-mine-grid-columns-with-selbtn-btn");
			thisEle.unbind("click").bind("click",function(e) {
				debugger;
				//不知道有没有修改，先保存
				thisObj.saveCurrentEditRow();
				var parentDialog = thisObj.options["parentDialog"];
				var columnListClass="tempo-mine-column-list";
				var ul = parentDialog.find("."+columnListClass);
				// 获取左侧表格的所有数据
				var leftTableData = ul.parent().parent().parent().mine_columnselect_page("getAllData");
				var leftTableDataLen = leftTableData.length;
				// 获取选中行
				// var selectLiTemp = ul.find(".tempo-mine-column-backgroundcolor");
				var selectLi = [];
				// 需要过滤已经隐藏的数据
				for (var i=0;i<leftTableDataLen.length;i++){
					// 跳过没有选中的
					if (leftTableData[i].isSelected + "" != "true") continue;
					// if ($(selectLiTemp[i]).attr("class").indexOf("nodisplay") == -1){
						selectLi.push(selectLiTemp[i]);
					// }
				}
				var uniquefield = thisObj.options.uniquefield;
				if (uniquefield) {
					var rightFieldSet = new Set();
					var gridTable = thisObj._callRightGridFunction("getGridTable");
					var rowDatas = gridTable.datagrid("getRowData");
					if (rowDatas.length > 0) {
						for (var i = 0; i < rowDatas.length; i++) {
							rightFieldSet.add(rowDatas[i].desc);
						}
					}
					if (selectLi.length > 0){
						for (var i = 0; i < selectLi.length; i++) {
							var data = $(selectLi[i]).data("data");
							rightFieldSet.add(data.desc);
						}
					}
					
					if (rightFieldSet.size > 1) {
						$("<div/>").alert({
							msg : TempoUtils.locale("mine.rightprocesssameonefiled"),
							title : TempoUtils.locale("mine.prompt")
						});
						return;
					}
				}
				// 列表最多能添加一条数据
				if (!thisObj.options["gridMaxData"] || thisObj.options["gridMaxData"] == 1){
					if (selectLi.length > 0){
						var data = $(selectLi[0]).data("data");
						//判断数据中是否有id属性，没有则添加
						thisObj._addIdColumn(data);
						if (!thisObj._isAllowType(data)){
							return;
						}
						thisObj.options.pendingDiv.mine_columnselect_page('removeRowData', [data]);
						// 清空列表数据
						thisObj._callRightGridFunction("getFromGridToTreeFunction")("",thisObj._getFieldErrorMap());
						thisObj._callRightGridFunction("getFromTreeToGridFunction")( $(selectLi[0]), data,thisObj._getFieldErrorMap());
					}
				} else {
					var maxNum = parseInt(thisObj.options["gridMaxData"]);
					var JSONArray = [];
					var leftData = [];
					for (var i=0;i<selectLi.length;i++){
						var gridTable = thisObj._callRightGridFunction("getGridTable");
						if(thisObj.options.directToEdit && thisObj.options.directToEdit.inEditDirect ==  false){
							var rowIds = gridTable.datagrid("getRowIds");
							if (rowIds.length+JSONArray.length == maxNum){
								$("<div/>").alert({
									msg : TempoUtils.locale("mine.zuiduoxuanze")+maxNum+TempoUtils.locale("mine.geziduan"),
									title : TempoUtils.locale("mine.prompt")
								});
								break;
							}
						}else{
							var rowIds = gridTable.datagrid("getRowIds");
							if (rowIds.length == maxNum){
								$("<div/>").alert({
									msg : TempoUtils.locale("mine.zuiduoxuanze")+maxNum+TempoUtils.locale("mine.geziduan"),
									title : TempoUtils.locale("mine.prompt")
								});
								return;
							}
						}	
						var data = $(selectLi[i]).data("data");
						// 克隆一下 因为都是同一个对象，不克隆后面改动id时候全部变动
						data = TempoUtils.clone(data);
						leftData.push(data);
						//判断字段是否符合类型
						if (!thisObj._isAllowType(data)){
							//不符合类型则返回
							return;
						}
						
						//默认不打开编辑，方可以用批量优化
						if(thisObj.options.directToEdit && thisObj.options.directToEdit.inEditDirect ==  false){
			      			var jsonNode = thisObj._callRightGridFunction("getJSONfromTreeToGridFunction")( $(selectLi[i]), data,thisObj._getFieldErrorMap(),false,thisObj.options.removeDup);
			      			if(Object.keys(jsonNode).length > 0){
			      				JSONArray.push(jsonNode);
			      			}
						}else{//兼容历史流程
							thisObj._callRightGridFunction("getFromTreeToGridFunction")( $(selectLi[i]), data,thisObj._getFieldErrorMap(),true,thisObj.options.removeDup);
						}
					}
					// 判断是否是分类汇总节点
					if (thisObj.element && (thisObj.element[0].id == "subtotal_splitCol" || thisObj.element[0].id == "subtotal_countCol" || thisObj.element[0].id == "subtotal_joinCol")){
						//如果是分类汇总节点，则不删除左侧表格数据
					}else {
						thisObj.options.pendingDiv.mine_columnselect_page('removeRowData', leftData);
					}

					var optRowData = thisObj.element.find("#"+thisObj.options.rightId).tempo_grid_columns_selected_page("getOptionRowData");
					// 判断是否有要添加的数据  JSONArray储存要添加的数据
					if (JSONArray.length > 0){
						var leftDatas = thisObj.initULData(leftData);
						for(var i = 0;i<leftDatas.length;i++){
							optRowData.push(leftDatas[i]);
						}
					}
					//默认不打开编辑的，批量优化一下
					//if(thisObj.options.directToEdit && thisObj.options.directToEdit.inEditDirect ==  false){
                    var gridTable = thisObj._callRightGridFunction("getGridTable");
						// var rightData = thisObj._callRightGridFunction("getAllEditOrDataFunction")();
						// var allData = rightData.concat(JSONArray);
						//在这里添加
					gridTable.datagrid_page("clearGridData");
					// gridTable.datagrid_page("setGridParam",{datatype:'local',data:optRowData})
                    // 判断数据是否去重
                    if (thisObj.options.removeDup){ // 去重
                        // 判断数据是否有id属性，没有则添加id属性
                        thisObj._addIdColumn(optRowData);
                    }else { // 不去重
                        //强制更改和添加id属性值
                        var len = optRowData.length;
                        for (var i=0; i<len; i++){
                            optRowData[i].id = TempoUtils.uuid();
                        }
                    }
                    //向表格添加数据，不能使用uuid当做rowid,表格在刷新时，将rowid替换data里的id属性
                    // optRowData.forEach(function(oneData){
                    //     gridTable.datagrid_page("addRowData", oneData.id, oneData);
                    // });
					 gridTable.datagrid_page("setGridParam",{datatype:'local',data:optRowData})
					// gridTable.datagrid_page("addRowData", jsPlumbUtil.uuid(), optRowData);
					gridTable.datagrid_page("reloadGrid");
					//}
				}
				thisObj._checkboxStyleSet();
				e.preventDefault();
			});
		},
		//触发右侧表格的数据转移到左侧树上（表转置节点优化时增加，其它节点应该也可以用）
		bindRightToLeft:function(){
			debugger
			var thisObj = this;
			var alRData = thisObj._callRightGridFunction("getAllEditOrDataFunction")();
			thisObj._callRightGridFunction("JSONFromGridToTreeFunction")(alRData,[],thisObj._getFieldErrorMap());
		},
		initULData:function(rowsData){
			var okClass = 'tempo-mine-grid-columns-status-ok';
			for (var i = 0; i < rowsData.length; i++) {
				rowsData[i].status = "<span class='"+okClass+"'></span>";
			}
			return rowsData;
		},
		_bindRightToLeft:function(){
			debugger
			// 绑定从右侧表格到左侧树的事件
			var thisObj = this;
			var thisEle = thisObj.element.find(".tempo-mine-grid-columns-with-selbtn-btn,.tempo-mine-grid-columns-with-selbtn-left-btn");
			thisEle.attr("class","tempo-mine-grid-columns-with-selbtn-left-btn");
			thisEle.unbind("click").bind("click",function(e) {
				debugger
				if(thisObj.options.directToEdit && thisObj.options.directToEdit.inEditDirect ==  false){
					//默认不打开编辑
					var gridTable = thisObj._callRightGridFunction("getGridTable");
					var alRData = thisObj._callRightGridFunction("getAllEditOrDataFunction")();
					var rSData = [];//右侧已经选中的data
					var rUSData = [];//右侧未选中的data
					// 获取右侧表格复选框选中的行
					var rsList = gridTable.find("tr[id] td[aria-describedby*='_cb'] input:checked").closest("tr");//右侧的选中列表
					var rOriList = gridTable.find("tr[id]");
					$.each(rsList,function(i,v){
						var botIndex = rOriList.index(v);//获得选中的列表的下标
						rSData.push(alRData[botIndex]);
						delete alRData[botIndex];
					});
					// 判断右侧有没有选中的值
					if (rSData.length == 0) {
						// 尝试获取右侧表格鼠标点击选中的行
						rsList = gridTable.find("tr[id][aria-selected='true']");
						$.each(rsList,function(i,v){
							var botIndex = rOriList.index(v);//获得选中的列表的下标
							rSData.push(alRData[botIndex]);
							delete alRData[botIndex];
						});
					}
					// for(var j = 0 ,len = alRData.length ; j < len ; j++){
					// 	var temp = alRData[j];
					// 	if(temp != null){
					// 		rUSData.push(temp);
					// 	}
					// }
					// thisObj._callRightGridFunction("JSONFromGridToTreeFunction")(rSData,rUSData,thisObj._getFieldErrorMap());
					//克隆rSData
					var delData = TempoUtils.clone(rSData);
					//在左侧添加数据，但rSData经过下面的方法会清空
					thisObj.options.pendingDiv.mine_columnselect_page('addRowData', rSData);
					//获取所有值
					var allData = gridTable.datagrid_page("getAllData");
					for(var i = 0 ; i < delData.length;i++){
						for(var j=0;j<allData.length;j++){
							if(delData[i].id == allData[j].id){
								//在右侧框中删除数据
								gridTable.datagrid_page("delRowData",allData[j].id);
								//在总数据中删除数据
								allData.splice(j,1);
								break;
							}
						}
					}
					//设置所有值
					gridTable.datagrid_page("setAllData",allData);
					gridTable.datagrid_page("clearGridData");
					gridTable.datagrid_page("setGridParam",{datatype:'local',data:allData});
					gridTable.datagrid_page("reloadGrid");
				}else{
					var gridTable = thisObj._callRightGridFunction("getGridTable");
					// var selectRowDatas = gridTable.datagrid_page("getSelectRowData");
					// var optRowData = thisObj.element.find("#"+thisObj.options.rightId).tempo_grid_columns_selected_page("getOptionRowData");
					// thisObj.options.pendingDiv.mine_columnselect_page('addRowData', selectRowDatas);
					// for(var i = 0 ; i < selectRowDatas.length;i++){
					// 	for(var j=0;j<optRowData.length;j++){
					// 		if(selectRowDatas[i].desc == optRowData[j].desc){
					// 			optRowData.splice(j,1);
					// 			break;
					// 		}
					// 	}
					// }
					// gridTable.datagrid_page("reloadGrid");
					var selectRowIds = gridTable.datagrid("getSelectRowIds");
					selectRowIds = TempoUtils.clone(selectRowIds);
					for (var i=0;i<selectRowIds.length;i++){
						thisObj._callRightGridFunction("getFromGridToTreeFunction")(selectRowIds[i],thisObj._getFieldErrorMap());
					}
				}
				e.preventDefault();
			    });
			
		},
		_isAllowType:function(thisData){
			var thisObj = this;
			// 是否允许选择的数据类型
			if (thisObj.options["allowTypes"].length > 0 && thisObj.options["allowTypes"].indexOf(thisData.type) == -1){
				var msg = TempoUtils.locale("mine.meta_grid_unsupport_type");
				var typeSelectValue = TempoMineMetaUtils.getFieldTypeSelectValue();
				if (typeSelectValue[thisData.type]){
					msg = msg.replace("${type}",typeSelectValue[thisData.type]);
				} else {
					msg = msg.replace("${type}",thisData.type);
				}
				$("<div/>").alert({
					msg:msg,
					title:TempoUtils.locale("mine.prompt")
				});
				return false;
			}
			return true;
		},
		_getFieldErrorMap:function(){
			var fieldErrorMap=this.options.fieldErrorMap;
			if(!fieldErrorMap){
				fieldErrorMap=this._callRightGridFunction("getFieldErrorMap");
			}
			return fieldErrorMap;
		},
		_checkboxStyleSet:function(){
			// 复选框样式修改，缩小跳动幅度（ie下存在问题，待完善）
			var checkboxArray = this.element.find(".tempo-datagrid-cbox-container");
			for (var i=0;i<checkboxArray.length;i++){
				if ($(checkboxArray[i]).find("span").length == 0){
					$(checkboxArray[i]).css({"padding-top":"10px","padding-bottom":"10px"});
				}
			}
		},
		updateOption:function(optionName, value){
			this.options[optionName] = value;
		},
        /**
         * 判断给定的数据是否有id字段，没有则加上id字段
         * @param data 给定的数据
         * @private
         */
        _addIdColumn: function (data) {
			// 没有值则返回
			if (!data) return;
			if (!data.length || data.length == 0) return;
			data.forEach(
				function(oneData){
					// 不存在id或id为空串则添加id
					if (!oneData.id || oneData.id == "") {
						oneData.id = TempoUtils.uuid();
					}
					// 直接将数据的选中状态置为false
					oneData.isSelected = false;
				}
			);
        }
	});
})(jQuery)